<?php
//PHP文件上传功能封装函数

/**
 * 实现文件上传(单)
 * @param array $file 需要上传的文件信息:一维5属性(name/tmp_name/type/error/size)
 * @param array $allow_type 允许上传的MIME类型
 * @param string $path 存储路径
 * @param string  &$error 如果出现错误的原因
 * @param array $allow_format 允许上传的文件格式
 * @param int $max_size =2000000 允许上传的最大值
 */
function upload_single($file, $allow_type, $path, &$error, $allow_format, $max_size = 2000000)
{
    //判断文件是否有效
    if (!is_array($file) || !isset($file['error'])) {
        //文件无效
        $error = '不是一个有效的文件';
        return false;
    }
    //判断保存路径是否有效
    if (!is_dir($path)) {
        //路径不存在
        $error = '文件存储路径不存在';
        return false;
    }
    //判断文件上传的过程中是否有错误
    switch ($file['error']) {
        case 1:
        case 2:
            $error = '文件超出服务器允许大小';
            return false;
        case 3:
            $error = '文件上传过程中出现问题,只上传一部分';
            return false;
        case 4:
            $error = '用户没有选择要上传的文件';
            return false;
        case 6:
        case 7:
            $error = '文件保存失败';
            return false;
    }
    //判断MIME类型
    if (!in_array($file['type'], $allow_type)) {
        //该文件类型不允许上传
        $error = '当前文件类型不允许上传';
        return false;
    }
    //判断后缀名是否允许
    //取出后缀
    $ext = ltrim(strrchr($file['name'], '.'), '.');
    if (!empty($allow_format) && !in_array($ext, $allow_format)) {
        //不允许上传
        $error = '当前文件的格式不允许上传';
        return false;

    }

    //判断当前文件大小是否满足当前要求
    if ($file['size'] > $max_size) {
        //文件过大
        $error = '当前上传的文件超出大小,最大允许' . $max_size . '字节';
        return false;
    }
    //构造一个文件名字:文件类型_-_当前年月日_当前时间戳.ext
    $fullName = strstr($file['type'], '/', true) . '-' . date('Ymd') . time();
    //拼凑后缀
    $fullName .= '.' . $ext;
    //移动到指定目录
    if (!is_uploaded_file($file['tmp_name'])) {
        //不是上传文件
        $error = '错误,不是上传文件';
        return false;
    }
    if (move_uploaded_file($file['tmp_name'], $path . $fullName)) {
        //成功
        return $fullName;
    } else {
        //移动失败
        $error = '文件上传失败';
        return false;
    }

}

//提供数据
$file = $_FILES['image'];
$path = 'uploads/';
$allow_type = ['image/jpg', 'image/jpeg', 'image/gif', 'image/pjpeg'];
$allow_format = ['jpg', 'gif', 'jpeg'];
$max_size = 800000;
if ($fileName = upload_single($file, $allow_type, $path, $error, $allow_format, $max_size)) {
    echo $fileName;
} else {
    echo $error;
}

























